Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

139
Visualizações
¿Cómo puedo "ordenar múltiples" una matriz de objetos en Javascript por claves?

Estoy tratando de "mejorar" mi función de clasificación para aceptar múltiples criterios y así hacer una clasificación múltiple de mi matriz de objetos.

Lo siento si esta es una pregunta simple, o si cometí errores de "novato", pero soy un desarrollador de frontend que aprende los fundamentos de JS y estoy tratando de aprender cómo funcionan las funciones de clasificación.

Aquí está mi código:

 const arrayOfObjects = [ { name: 'John', age: 30, city: 'New York', details: { occupation: 'developer', } }, { name: 'Jane', age: 25, city: 'Paris', details : { occupation: 'designer', } } ]; // This is my main sorting function that I'd like to use for "multi sorting" an array of objects function sortByKey(criteria) { return (a, b) => { let comparison = 0; criteria.forEach(criterion => { const varA = (typeof resolvePath(criterion.key, a) === 'string') ? resolvePath(criterion.key, a).toUpperCase() : resolvePath(criterion.key, a); const varB = (typeof resolvePath(criterion.key, b) === 'string') ? resolvePath(criterion.key, b).toUpperCase() : resolvePath(criterion.key, b); if (varA > varB) { comparison = 1; } else if (varA < varB) { comparison = -1; } if(criterion.order === 'desc') { comparison = (comparison * -1) } }); return comparison; }; } // This function is used to resolve the path of a key in an object function resolvePath(path, obj) { return path.split('.').reduce(function(prev, curr) { return prev ? prev[curr] : null }, obj || self) }

El uso de esto es:

 // MAIN USAGE console.log( arrayOfObjects.sort(sortByKey([ { key: 'age' } ])) ) console.log( arrayOfObjects.sort(sortByKey([ { key: 'details.occupation', order: 'desc' } ])) )

Pero me gustaría usarlo algún tipo de:

 console.log( arrayOfObjects.sort(sortByKey([ { key: 'details.occupation' }, { key: 'age', order: 'desc' ])) )

Esto se debe a que quiero dar a los usuarios la posibilidad de clasificar mi matriz en algún tipo de orden, como "Primero la edad, segundo el nombre, etc...".

Gracias por cualquier ayuda útil, ¡que tengas un buen día!

about 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Cree una función que devuelva el valor del comparador para cada criterio. Recorra la matriz y llame a la función de comparación HASTA que se encuentre un valor distinto de cero. find dejará de buscar cuando compareByKey devuelva 1 o -1 .

 const sortByKey = (criteria) => (a, b) => { let returnValue = 0; criteria.find(c => returnValue = compareByKey(c, a, b)); return returnValue; } function compareByKey({ key, order = 'asc' }, a, b) { const varA = resolvePath(key, a) const varB = resolvePath(key, b) let comparison = 0; if (varA > varB) { comparison = 1; } else if (varA < varB) { comparison = -1; } if (order === 'desc') { comparison *= -1 } return comparison }

Si la parte de find es confusa o fea:

Otra forma sería reduce el valor de comparación de cada propiedad. Pero esto no provoca un cortocircuito cuando se encuentra un valor distinto de cero.

 const sortByKey = criteria => (a, b) => criteria.reduce((acc,c) => acc || compareByKey(c, a, b), 0)

o

 const sortByKey = (criteria) => (a, b) => { let comparedValue = 0; for (const c of criteria) { comparedValue = compareByKey(c, a, b); if (comparedValue) return comparedValue; } return comparedValue; } 

 const arrayOfObjects = [{ name: 'John', age: 30, city: 'New York', details: { occupation: 'developer', } }, { name: 'Jane', age: 25, city: 'Paris', details: { occupation: 'designer', } }, // added another designer for testing { name: 'Jane 2', age: 30, city: 'Paris', details: { occupation: 'designer', } } ]; const sortByKey = (criteria) => (a, b) => { let returnValue = 0; criteria.find(c => returnValue = compareByKey(c, a, b)); return returnValue; } function compareByKey({ key, order = 'asc' }, a, b) { const varA = resolvePath(key, a) const varB = resolvePath(key, b) let comparison = 0; if (varA > varB) { comparison = 1; } else if (varA < varB) { comparison = -1; } if (order === 'desc') { comparison *= -1 } return comparison } // This function is used to resolve the path of a key in an object function resolvePath(path, obj) { return path.split('.').reduce(function(prev, curr) { return prev ? prev[curr] : null }, obj || self) } console.log(arrayOfObjects.sort(sortByKey([ { key: 'details.occupation' }, { key: 'age', order: 'desc' } ])))

about 4 years ago · Santiago Trujillo Relatório

0

Puedes probar :

 const arrayOfObjects = [{ id: 3, name: 'Jane', age: 25, city: 'Paris', details: { occupation: 'designer', } }, { id: 1, name: 'John', age: 30, city: 'New York', details: { occupation: 'developer', } }, { id: 2, name: 'Bob', age: 25, city: 'New York', details: { occupation: 'developer', } }, ]; let sortByKey = function (a, b, keys) { for (let key of keys) { if (a[key.key] != b[key.key]) return (a[key.key] > b[key.key] ? 1 : -1) * (key.order == 'desc' ? -1 : 1); } return 0; } let result = arrayOfObjects.sort((a, b) => sortByKey(a, b, [{ key: 'age' }, { key: 'city', order: 'desc' }])); console.log(result);
about 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda